/******************************************************************************************
版权所有 2021-2021, 长春理工大学C&I实验室。保留所有权利。
文件名：mpp40_sys.c
作者：Wind    版本：V1.0    日期：2021.1.8
文件描述：
    对Hi3516EV200视频编码过程调用MPP操作的封装。
其它说明：

历史修改记录：
1. 2021-1-8:V1.0 Wind
创建。

******************************************************************************************/
//+------------------------------------------------------------------------------------------+
//|                                          文件说明
//+------------------------------------------------------------------------------------------+
//|  编写参考《HiMPP V4.0媒体处理软件开发参考(2019-3-5)》（简称《参考》）。    
//+------------------------------------------------------------------------------------------+
//|                                         头文件包含
//+------------------------------------------------------------------------------------------+
/*|*/#include <stdio.h>
/*|*/#include "hi_type.h"
/*|*/#include "hi_buffer.h"
/*|*/#include "hi_defines.h"
/*|*/#include "mpi_sys.h"
/*|*/#include "mpi_vb.h"
/*|*/#include "mpi_isp.h"
//|
/*|*/#include "mpp40_debug.h"
/*|*/#include "mpp40_sys.h"
//+------------------------------------------------------------------------------------------+
//|  函数名称：sys_init
//|  功能描述：初始化MPP SYS
//|  参数说明：无
//|  返回值说明：成功返回0
//|  备注：
//+------------------------------------------------------------------------------------------+
int sys_init(void)
{
    HI_S32 s32Ret = HI_SUCCESS;
    //----------------------------------------
    //[说明]计算并申请缓冲池
    //其中u32MaxPoolCnt为整个系统中可容纳缓冲
    //池的个数，对于Hi3516EV200，该值最大为512。
    //最大的公共视频缓冲池个数为16，即
    //astCommPool[]元素最大16。
    //——《参考》P150
    //----------------------------------------
    VB_CONFIG_S stVbConf;
    memset(&stVbConf, 0, sizeof(VB_CONFIG_S));
    //----------------------------------------
    //[注意]为了对接VENC时提供图像缩小的能力，
    //这里COMMON_GetPicBufferSize函数的第5个
    //参数必须为非压缩(COMPRESS_MODE_NONE)！
    //如果不需要调用VGS则可以使用COMPRESS_MODE_SEG
    //
    //[其它]在Hi3516EV200和Hi3516DV300平台上
    //测试时发现，如果此处不设置为非压缩，
    //后续的VENC调用VGS将失败。
    //----------------------------------------
    stVbConf.astCommPool[0].u64BlkSize = COMMON_GetPicBufferSize(1920, 
                                                1080, 
                                                PIXEL_FORMAT_YVU_SEMIPLANAR_420, 
                                                DATA_BITWIDTH_8,
                                                COMPRESS_MODE_NONE,
                                                DEFAULT_ALIGN);
    stVbConf.astCommPool[0].u32BlkCnt = 3;//[参考]在线模式3，离线模式2
    stVbConf.u32MaxPoolCnt = VB_MAX_POOLS;
    
    HI_MPI_SYS_Exit();
    HI_MPI_VB_Exit();
    
    s32Ret = HI_MPI_VB_SetConfig(&stVbConf);
    if(HI_SUCCESS != s32Ret)
    {
        MPP_OUTPUT("[MPP40-ISP-ERROR]HI_MPI_VB_SetConf failed!\n");
        goto FAIL;
    }
    
    s32Ret = HI_MPI_VB_Init();
    if(HI_SUCCESS != s32Ret)
    {
        MPP_OUTPUT("[MPP40-ISP-ERROR]HI_MPI_VB_Init failed!\n");
        goto FAIL;
    }
    
    s32Ret = HI_MPI_SYS_Init();
    if(HI_SUCCESS != s32Ret)
    {
        MPP_OUTPUT("[MPP40-ISP-ERROR]HI_MPI_SYS_Init failed!\n");
        goto FAIL;
    }
    
    return s32Ret;
    
FAIL:
    sys_deinit();
    return s32Ret;
}

//+------------------------------------------------------------------------------------------+
//|  函数名称：sys_deinit
//|  功能描述：去初始化MPP SYS
//|  参数说明：无
//|  返回值说明：无
//|  备注：
//+------------------------------------------------------------------------------------------+
void sys_deinit(void)
{
    HI_MPI_SYS_Exit();
    //----------------------------------------
    //VDEC模块公共池仅在解码*帧存分配方式*使用
    //模块公共VB池时才需要创建。
    //
    //此时需要先使用HI_MPI_VB_SetModPoolConfig
    //函数设置缓冲池，使用HI_MPI_VB_InitModCommPool
    //函数初始化，最后在HI_MPI_VB_Exit函数之前
    //调用HI_MPI_VB_ExitModCommPool函数退出
    //VDEC缓冲池。
    //该退出操作仅对VDEC有效，编码过程无需此步骤。
    //——《参考》P96
    //----------------------------------------
    /* e.g. HI_MPI_VB_ExitModCommPool(VB_UID_VDEC); */
    HI_MPI_VB_Exit();
}
